home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 7 / Apprentice-Release7.iso / Source Code / C / Applications / Moscow ML 1.42 / src / mosmllib / test / math.sml < prev    next >
Encoding:
Text File  |  1997-08-18  |  5.0 KB  |  141 lines  |  [TEXT/R*ch]

  1. (* test/math.sml 
  2.    PS 1995-02-25, 1996-04-01, 1997-03-07
  3. *)
  4.  
  5. use "auxil.sml";
  6.  
  7. local
  8.     open Math
  9.     val MAXDOUBLE = 8.98846567431157E307;
  10.     val MINDOUBLE = 4.94065645841246544E~324
  11.     val PI = 3.14159265358979323846;
  12.     val E = 2.7182818284590452354;
  13.  
  14.     val eps = 1E~8
  15.     infix 4 ===
  16.     fun x === y = 
  17.     abs (x - y) <= eps orelse abs(x-y) <= eps * (abs x + abs y)
  18.  
  19.     fun check1 (opr, a, r) = if opr a === r then "OK" else "WRONG"
  20.     fun check2 (opr, a1, a2, r) =
  21.     if opr(a1, a2) === r then "OK" else "WRONG"
  22. in
  23.  
  24. val test0a = check(PI === pi);
  25. val test0b = check(E === e);
  26.  
  27. val test1a = check1(sqrt, 64.0, 8.0);
  28. val test1b = check1(sqrt, 0.0, 0.0);
  29. val test1c = (sqrt ~1.0 seq "WRONG") handle Domain => "OK" | _ => "WRONG";
  30.  
  31. val test2a = check1(sin, 0.0, 0.0);
  32. val test2b = check1(sin, pi/2.0, 1.0);
  33. val test2c = check1(sin, pi, 0.0);
  34. val test2d = check1(sin, 3.0*pi/2.0, ~1.0);
  35.  
  36. val test3a = check1(cos, 0.0, 1.0);
  37. val test3b = check1(cos, pi/2.0, 0.0);
  38. val test3c = check1(cos, pi, ~1.0);
  39. val test3d = check1(cos, 3.0*pi/2.0, 0.0);
  40.  
  41. val test4a = check1(tan, 0.0, 0.0);
  42. val test4b = check1(tan, pi/4.0, 1.0);
  43. val test4c = check1(tan, pi, 0.0);
  44. val test4d = check1(tan, 3.0*pi/4.0, ~1.0);
  45. val test4e = check1(tan, ~pi/4.0, ~1.0);
  46. val test4f = check((abs(tan (pi/2.0))  > 1E8) handle _ => true);
  47. val test4g = check((abs(tan (~pi/2.0)) > 1E8) handle _ => true);
  48.  
  49. val test5a = check1(asin, 0.0, 0.0);
  50. val test5b = check1(asin, 1.0, pi/2.0);
  51. val test5c = check1(asin, ~1.0, ~pi/2.0);
  52. val test5d = (asin 1.1 seq "WRONG") handle Domain => "OK" | _ => "WRONG";
  53. val test5e = (asin ~1.1 seq "WRONG") handle Domain => "OK" | _ => "WRONG";
  54.  
  55. val test6a = check1(acos, 1.0, 0.0);
  56. val test6b = check1(acos, 0.0, pi/2.0);
  57. val test6c = check1(acos, ~1.0, pi);
  58. val test6d = (acos 1.1 seq "WRONG") handle Domain => "OK" | _ => "WRONG";
  59. val test6e = (acos ~1.1 seq "WRONG") handle Domain => "OK" | _ => "WRONG";
  60.  
  61. val test7a = check1(atan, 0.0, 0.0);
  62. val test7b = check1(atan, 1.0, pi/4.0);
  63. val test7c = check1(atan, ~1.0, ~pi/4.0);
  64. val test7d = check1(atan, 1E8, pi/2.0);
  65. val test7e = check1(atan, ~1E8, ~pi/2.0);
  66.  
  67. (* atan2 -- here I am in doubt over the argument order, since the New
  68. Basis document is inconsistent with itself and with atan2 in the C
  69. libraries. *)
  70.  
  71. val test8a = check2(atan2, 0.0, 0.0, 0.0);
  72. val test8b = check2(atan2, 1.0, 0.0, pi/2.0);
  73. val test8c = check2(atan2, ~1.0, 0.0, ~pi/2.0);
  74. val test8d = check2(atan2, 1.0, 1.0, pi/4.0);
  75. val test8e = check2(atan2, ~1.0, 1.0, ~pi/4.0);
  76. val test8f = check2(atan2, ~1.0, ~1.0, ~3.0*pi/4.0);
  77. val test8g = check2(atan2, 1.0, ~1.0, 3.0*pi/4.0);
  78. val test8h = check2(atan2, 1E8, 1.0, pi/2.0);
  79. val test8i = check2(atan2, ~1E8, 1.0, ~pi/2.0);
  80. val test8j = check2(atan2, 1.0, 1E8, 0.0);
  81. val test8k = check2(atan2, 1.0, ~1E8, pi);
  82. val test8l = check2(atan2, ~1.0, ~1E8, ~pi);
  83.  
  84. val test9a = check1(exp, 0.0, 1.0);
  85. val test9b = check1(exp, 1.0, e);
  86. val test9c = check1(exp, ~1.0, 1.0/e);
  87.  
  88. val test10a = check1(ln, 1.0, 0.0);
  89. val test10b = check1(ln, e, 1.0);
  90. val test10c = check1(ln, 1.0/e, ~1.0);
  91. val test10d = (ln 0.0 seq "WRONG") handle Domain => "OK" | _ => "WRONG";
  92. val test10e = (ln ~1.0 seq "WRONG") handle Domain => "OK" | _ => "WRONG";
  93.  
  94. val test12a = check2(pow, 0.0, 0.0, 1.0); (* arbitrary, might be 0.0 *)
  95. val test12b = check2(pow, 7.0, 0.0, 1.0); 
  96. val test12c = check2(pow, 0.0, 7.0, 0.0); 
  97. val test12d = check2(pow, 64.0, 0.5, 8.0); 
  98. val test12e = check2(pow, ~9.0, 2.0, 81.0); 
  99. val test12f = check2(pow, 10.0, ~2.0, 0.01); 
  100. val test12g = check2(pow, ~10.0, ~2.0, 0.01); 
  101. val test12h = check2(pow, 0.0, 0.5, 0.0); 
  102. val test12i = check2(pow, 0.4, ~2.0, 6.25); 
  103.  
  104. val test12j = (pow(0.0, ~1.0) seq "WRONG") 
  105.               handle Domain => "OK" | _ => "WRONG";
  106. val test12k = (pow(0.0, ~0.5) seq "WRONG") 
  107.               handle Domain => "OK" | _ => "WRONG";
  108. val test12l = (pow(~1.0, 1.1) seq "WRONG") 
  109.               handle Domain => "OK" | _ => "WRONG";
  110. val test12m = (pow(~1.0, 0.5) seq "WRONG") 
  111.               handle Domain => "OK" | _ => "WRONG";
  112. (* val test12n = (pow(3.0, 1000000.0) seq "WRONG") 
  113.               handle Overflow => "OK" | _ => "WRONG";
  114. *)
  115. val test13a = check1(log10, 1.0, 0.0);
  116. val test13b = check1(log10, 10.0, 1.0);
  117. val test13c = check1(log10, 100.0, 2.0);
  118. val test13d = check1(log10, 0.1, ~1.0);
  119. val test13e = check1(log10, 0.01, ~2.0);
  120.  
  121. val check14a = check1(sinh, 0.0, 0.0);
  122. val check14b = check1(sinh,  1.0, 1.17520119364);
  123. val check14c = check1(sinh, ~1.0, ~1.17520119364);
  124. val check14d = check1(sinh,  2.0,  3.62686040785);
  125. val check14e = check1(sinh, ~2.0, ~3.62686040785);
  126.  
  127. val check15a = check1(cosh, 0.0, 1.0);
  128. val check15b = check1(cosh,  1.0, 1.54308063482);
  129. val check15c = check1(cosh, ~1.0, 1.54308063482);
  130. val check15d = check1(cosh,  2.0, 3.76219569108);
  131. val check15e = check1(cosh, ~2.0, 3.76219569108);
  132.  
  133. val check15a = check1(tanh, 0.0, 0.0);
  134. val check15b = check1(tanh,  1.0,  0.761594155956);
  135. val check15c = check1(tanh, ~1.0, ~0.761594155956);
  136. val check15d = check1(tanh,  2.0,  0.964027580076);
  137. val check15e = check1(tanh, ~2.0, ~0.964027580076);
  138. val check15f = check1(tanh,  100.0,  1.0);
  139. val check15g = check1(tanh, ~100.0, ~1.0);
  140. end
  141.